package com.sz.biz.logistics.ord.service;

import com.sz.biz.logistics.ord.dto.*;
import com.sz.biz.logistics.ord.service.impl.OrdTrackingResult;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.biz.logistics.ord.entity.OrdOrder;
import com.sz.biz.logistics.ord.entity.OrdOrderStatusCode;
import com.sz.biz.logistics.ord.entity.OrdOrderTracking;
import com.sz.biz.logistics.ord.entity.OrdTrackingMessage;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Function: 物流跟踪service <br>
 * Author: hpeng.wang <br>
 * Date: 2017-03-31 13:46:00
 */

public interface OrdOrderTrackingService {
    /**
     * 新增
     *
     * @param entry 新增的实体
     * @return 新增是否成功
     */
    void save(OrdOrderTracking entry);

    /**
     * 批量新增
     *
     * @param list 新增的实体
     */
    void batchSave(List<OrdOrderTracking> list);

    /**
     * 根据主键id删除实体
     *
     * @param id 主键id
     */
    void delete(Integer id);

    /**
     * 根据主键id删除实体
     *
     * @param ids 主键id集合
     */
    void batchDelete(List<Integer> ids);

    /**
     * 批量修改实体
     *
     * @param list
     */
    void batchUpdate(List<OrdOrderTracking> list);

    /**
     * 更新实体
     *
     * @param entry 更新的实体
     * @return 新增是否成功
     */
    void update(OrdOrderTracking entry);


    /**
     * 根据主键Id查询单个实体
     *
     * @param id 主键id
     * @return 查询出来的实体对象
     */
    OrdOrderTracking findById(Integer id);

    /**
     * 根据id集合查询实体
     *
     * @param ids
     * @return
     */
    List<OrdOrderTracking> findByIds(List<Integer> ids);

    /**
     * 根据条件查询实体
     *
     * @param params 查询的参数集
     * @return 查询出的数据
     */
    QResultDto findByParam(QueryParams params);

    /**
     * 根据waybillNo查询实体
     *
     * @param sid
     * @param waybillNo
     */
    void checkCode(int sid, String waybillNo);

    /**
     * 根据waybillNo获取物流信息
     *
     * @param waybillNo 运单编号
     * @return 物流信息集合数年
     */
    List<OrdOrderTracking> findByWaybillNo(String waybillNo);
    List<OrdOrderTracking> findByWaybillNo(String waybillNo,String code,String serviceUid,int status);
    List<OrdOrderTracking> findByWaybillNo(String waybillNo,String code,int status);
    List<OrdOrderTracking> findByWaybillNo(String waybillNo,String code);

    List<OrdOrderTracking> findBySubOrderNos(List<String> subOrderNos);

    /**
     * 根据waybillNo 与rank获取物流跟踪数据
     *
     * @param rankList  级别
     * @param waybillNo 运单编号
     * @return 数据信息
     */
    Map<String, List<OrdOrderTrackingShowDto>> findByWaybillNo(List<Integer> rankList, String waybillNo);

    /**
     * 根据waybillNo 与rank获取物流跟踪数据
     *
     * @param rankList
     * @param waybillNos
     * @return
     */
    Map<String, Map<String, List<OrdOrderTrackingShowDto>>> findByWaybillNo(List<Integer> rankList, List<String> waybillNos);


    /**
     * 处理数据转换平台转换的物流返回信息
     *
     * @param tracking
     * @return
     */
    int saveAfterTracking(OrdOrderTracking tracking);

    /**
     * 获取一个服务商给一个订单下面的子订单返回的对应状态的子订单的单号
     *
     * @param waybillNo  订单编号
     * @param serviceUid 服务商的编号
     * @param status     事件状态
     * @return
     */
    List<String> getFinishedSubOrdNos(String waybillNo, String serviceUid, Integer status);


    /**
     * 获取当前时间前的上一条tracking记录
     *
     * @param waybillNo
     * @param serviceUid
     * @param date
     * @return
     */
    OrdOrderTracking getLastTracking(String waybillNo, String serviceUid, Date date);


    /**
     * 根据订单号组装下发给供应商的消息
     *
     * @param waybillNo
     * @return
     */
    OrderTrackingToServiceDto processOrderTrackMessage(String waybillNo);

    /**
     * 根据订单号，子单号组装子单的信息dto
     *
     * @return
     */
    TrackingToSupOrder processSubOrderTracking(String orderNo);

    /**
     * 新增物流信息
     * 物流返回信息包括了物流信息，第一个供应商返回物流信息时包含了子单的长宽高 重量
     *
     * @param trackingSupOrder 要保存的物流信息集合
     * @return
     */

    OrdTrackingResult processAfterTracking(TrackingSupOrder trackingSupOrder);


    void processReceGoodTracking(List<OrdTrackingTransDto> trackingTransDtoList);

    /**
     * 处理供应商发给三藏平台正常的物流信息
     *
     * @param orderNormalTrackingDtos
     */
    void processNomarlTracking(List<OrderNormalTrackingDto> orderNormalTrackingDtos, String batchNo);

    /**
     * 修改订单以后，给供应商发送一个订单信息变更的消息
     * 根据订单号，给对应的服务-供应商发送订单的信息
     *
     * @param waybillNo
     * @param serviceUid
     */
    void addMsgAfterUpdateOrder(String waybillNo, String serviceUid, Integer supplierId);


    /**
     * 人工添加子单的物流信息之后，给供应商发送的信息
     *
     * @param waybillNo
     * @param subOrderNo
     * @param serviceUid
     * @param supplierId
     */
    void addMsgAfterAddSubTracking(String waybillNo, String subOrderNo, String serviceUid, Integer supplierId);


    /**
     * 给供应商的订单信息的tracking
     *
     * @param waybillNo
     * @param code:      tracking类型
     * @param type:      消息类型  来自COMMONCODES
     * @param serviceUid
     * @param supplierId
     * @return
     */
    OrdTrackingMessage orderTrackingToService(String waybillNo, String code, int type, String serviceUid, int supplierId);


    /**
     * 组装给供应商的子单信息的tracking
     *
     * @param orderNo
     * @param code
     * @param type
     * @param serviceUid
     * @param supplierId
     * @param waybillNo
     * @return
     */
    OrdOrderTracking subOrderTrackingToService(String orderNo, String subOrderNo, String code, int type, String serviceUid, int supplierId, String waybillNo);

    /**
     * 增加子单的物流信息
     *
     * @param dto
     */
    void addSubTracking(SubOrderTrackingDto dto);

    /**
     *  @param contentList
     * @param code
     * @param param
     * @param messageTime
     * @param type OrderTrackingConstants.TrackingAddNoType.TRACKING_TYPE_SYSTEM
     */
    List<String> addTracking(List<String> contentList, String code, List<String> param, Date messageTime, int type);

    void checkLegal(int type, String param);

    void batchSaveByStatusCode(OrdOrder ordOrder, List<String> subOrderNos, List<OrdOrderStatusCode> statusCodes, Date messageTime);

    void batchSaveByStatusCodeTrans(OrdOrder ordOrder, List<String> subOrderNos, List<OrdOrderStatusCode> statusCodes, Date messageTime);

    List<OrdOrderTracking> findByWaybillNos(List<String> waybillNos);


    String getTrackingString(String messageTemplate, String trackMessage);
}
